Meiko 和 Jason 快要把他們的咖哩吃完囉,來看看今天他們討論些什麼?Licensed by Adobe Stock
Meiko:「對了,Jason,你這次教了我dictionary
,我觀察餐廳的服務生,看起來不會用一個一個的dictionary
來整理菜單,他們會用什麼樣的方式來管理出菜啊?」
Jaosn:「我也這樣覺得,我覺得比較好的方式應該是放在串列list
裡面。先前我們有用串列來放有順序的資料,因為串列內建的順序,可以方便我們抓取資料!」
Meiko:「歐,串列list
除了直接存字串和數字之外,還可以把 dictionary 也放到裡面呀?」
Jason :「對啊,在 Python 裡面串列list
和字典dictionary
都是容器的型態(白話就是都是可以用來裝資料用的),所以串列也可以用來裝字典。」
Meiko:「聽起來就好像塑膠袋可以裝東西,背包也可以裝東西的感覺!」
Jason:「... 也可以這樣說拉,如果你想要把dictionary
增加到 list
裡面,我們可以用.append()
這個方法來做。但在開始之前,你要先宣告一個空的串列,像我這邊是把orderList
設定成list()
。」
orderList=list()
orderList.append(order_1)
orderList.append(order_2)
print (orderList)
Jason:「接著再把order_1
和order_2
用.append()
這個方法,把它們加到orderList
裡面。」
Meiko:「看這樣的寫法好像蠻有意思的,可是這個輸出的結果實在不太適合人眼觀看耶!」
Jason:「說的也是,你記得我們之前也用for-loop
把串列list
裡面的內容印出來嗎?現在我們把 dictionary
放到了串列list
裡面,也提到dictionary
也可以用for-loop
去印出來,你有沒有想到該怎麼做,才把orderList
裡面的所有資訊都印出來?」
Meiko:「對耶,我們先前就是用for-loop
印出星期一到星期日,這些資訊是存放在串列list
裡面。至於 dictionary
用for-loop
印,你剛才才提過把我們吃的咖哩飯套餐的內容印出來。但,是要連用兩次 for-loop 的意思嗎?」
Jason:「其實蠻接近的,在程式裡面有一個專有名詞叫做 2 層巢狀for-loop
,意思就是在迴圈裡面又再包覆另外一個迴圈。所以像這個例子,我們不是把dictionary
放到list
裡面嗎?所以外層迴圈就會是把list
裡面的每一個元素印出來。像這樣...」
for i in range(len(orderList)):
print (orderList[i])
Jason:「我先不跟你說 2 層巢狀迴圈,我們先看上面這部分的程式,你有看到熟悉的程式碼嗎?」
Meiko:「這跟之前要印出串列 list 是一樣的呀,有一個 index 叫做 i 在....誒,Jason 你怎麼不是寫這樣?」
for i in orderList:
print (orderList[i])
Meiko:「誒,出現錯誤!怎麼會!『list indices must be integers or slices, not dict』是什麼意思?」
Jason :「它意思是說串列list
裡的 index 需要是數字,不能是dictionary
(dict 是 dictionary 的縮寫)!我們不是把dictionary
裝到list
裡面嗎?所以現在 orderList
裡面的物件就不能直接用 i 這個 index 取用。」
Meiko:「歐,原來是這樣,早說麻...」
Jason:「我會用range()
來界定範圍,然後用len()
這個函數來計算orderList
的長度,所以 range(len(orderList))
就會是依照orderList
的長度,當作是一個range()
的範圍。」
for i in range(len(orderList)):
print (orderList[i])
Meiko:「原來,這樣聽起來也蠻合理的,那再下一步?現在看起來print (orderList[i])
,有分別把我們剛寫的order_1
和order_2
的dictionary
印出來,可是還是不太好理解。」
Jason :「你記得我們有提過的.item()
和 key、value 嗎?(日式咖哩店的資訊對話,活用字典 dictionary 儲存資料(中))我會這樣寫
for i in range(len(orderList)):
localDic=orderList[i]
for key,value in localDic.items():
print (key,value)
Meiko:「我記得看到裡面那層,用 key、value 的方式,把localDic
用.items()
的方式印出對應的 key 和 value 值。這樣看來 Jason,你先把orderList[i]
指定到localDic
對吧?
for i in range(len(orderList)):
localDic=orderList[i]
Jason:「沒錯,我透過一次的指定,先把串列list
的內容指定到一個叫做localDic
的變數,接著,因為它是一個dictionary
,所以我們就可以接著用先前學過的for-loop
和.items()
把對應的 key 和 value 都印出來囉!」
Meiko:「歐這樣子我比較懂了,不過這兩個訂單都黏在一起,能否把他們分開,比較容易觀看?」
Jason:「的確,如果我們加一些字串說明的話,可能會有些幫助!像這樣...」
for i in range(len(orderList)):
localDic=orderList[i]
print ('第 %s 筆訂單 ======'%(localDic['orderId']))
for key,value in localDic.items():
print (key,value)
Meiko:「看起來清楚多了,至少每筆訂單又區分開來,話說 Jason,我們飯也吃完,酒也喝完了,好像可以去下個地方續攤啦!」
Jason :「對啊,吃的真飽,這家店的餐點份量真大,難怪外面還是很多客人大排長龍,我們就不在這佔位置囉,Let’s go!」
我大寶寶~拉,今天介紹的巢狀for-loop
和dictionary
的用法,都是大寶寶在工作上會運用到的技巧唷,就像今天 Meiko 和 Jason 聊天的時候提到,很多資料都是用dictionary
的格式存下來,但資料又不可能只有單一存在。所以這邊透過for-loop
就可以一次處理很多資料!之後,還會搭配 Numpy 或 Pandas 套件,畢竟有前人的努力,我們後輩只要站在巨人的肩膀上寫程式就能更有效率囉!
歡迎登入留言跟我分享你的想法唷!(登入不麻煩,點一下 FB 登入就可以留言了!)
1.喜歡這樣方式學 Python 的朋友請留言『+1』
2.如果前面的內容忘記了,趕快看一下大寶寶這一系列的看對話學 Python 資料分析,用情境故事帶你入門的列表!就能夠繼續 Happy Coding 囉!